home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2 Examples.sit
/
Raven 1.2 Examples
/
Quill
/
Source
/
AdornerEditor.cpp
next >
Wrap
Text File
|
1997-08-11
|
15KB
|
451 lines
/*
* File: AdornerEditor.cpp
* Summary: A view that knows how to edit a pane's adorners.
* Written by: Jesse Jones
*
* Copyright ゥ 1996-1997 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <3> 5/11/97 JDJ Now allows user to specify color and pen.
* <2> 4/06/97 JDJ Updated for new style TSubPaneIterator.
* <1> 11/24/96 JDJ Created
*/
#include "AdornerEditor.h"
#include <ZAdorners.h>
#include <ZColorSwatch.h>
#include <ZPaneAdorners.h>
#include <ZStringUtils.h>
#include "RsrcPopupMenu.h"
// ===================================================================================
// class CEditAdornersCommand
// ===================================================================================
//---------------------------------------------------------------
//
// CEditAdornersCommand::~CEditAdornersCommand
//
//---------------------------------------------------------------
CEditAdornersCommand::~CEditAdornersCommand()
{
}
//---------------------------------------------------------------
//
// CEditAdornersCommand::CEditAdornersCommand
//
//---------------------------------------------------------------
CEditAdornersCommand::CEditAdornersCommand(TPane* pane, const SAdornerInfo& oldInfo, const SAdornerInfo& newInfo) : Inherited(pane, oldInfo, newInfo)
{
}
//---------------------------------------------------------------
//
// CEditAdornersCommand::UpdatePane
//
//---------------------------------------------------------------
void CEditAdornersCommand::UpdatePane(const SAdornerInfo& info)
{
TAdorner* adorner = nil;
adorner = mPane->FindAdorner("TDefaultButtonAdorner");
if (info.hasDefaultButtonAdorner && adorner == nil)
mPane->AddAdorner(new TDefaultButtonAdorner);
else if (!info.hasDefaultButtonAdorner)
delete adorner;
adorner = mPane->FindAdorner("TEraseAdorner");
if (info.hasEraseAdorner)
if (adorner == nil)
mPane->AddAdorner(new TEraseAdorner(info.eraseColor));
else
dynamic_cast<TEraseAdorner*>(adorner)->SetColor(info.eraseColor);
else if (!info.hasEraseAdorner)
delete adorner;
adorner = mPane->FindAdorner("TFocusRectAdorner");
if (info.hasFocusAdorner && adorner == nil)
mPane->AddAdorner(new TFocusRectAdorner);
else if (!info.hasFocusAdorner)
delete adorner;
adorner = mPane->FindAdorner("TFrameAdorner");
if (info.hasFrameAdorner)
if (adorner == nil)
mPane->AddAdorner(new TFrameAdorner(info.framePen));
else
dynamic_cast<TFrameAdorner*>(adorner)->SetPenID(info.framePen);
else if (!info.hasFrameAdorner)
delete adorner;
adorner = mPane->FindAdorner("TLineBottomAdorner");
if (info.hasLineBottomAdorner)
if (adorner == nil)
mPane->AddAdorner(new TLineBottomAdorner(info.lineBottomPen));
else
dynamic_cast<TLineBottomAdorner*>(adorner)->SetPenID(info.lineBottomPen);
else if (!info.hasLineBottomAdorner)
delete adorner;
adorner = mPane->FindAdorner("TLineLeftAdorner");
if (info.hasLineLeftAdorner)
if (adorner == nil)
mPane->AddAdorner(new TLineLeftAdorner(info.lineLeftPen));
else
dynamic_cast<TLineLeftAdorner*>(adorner)->SetPenID(info.lineLeftPen);
else if (!info.hasLineLeftAdorner)
delete adorner;
adorner = mPane->FindAdorner("TLineRightAdorner");
if (info.hasLineRightAdorner)
if (adorner == nil)
mPane->AddAdorner(new TLineRightAdorner(info.lineRightPen));
else
dynamic_cast<TLineRightAdorner*>(adorner)->SetPenID(info.lineRightPen);
else if (!info.hasLineRightAdorner)
delete adorner;
adorner = mPane->FindAdorner("TLineTopAdorner");
if (info.hasLineTopAdorner)
if (adorner == nil)
mPane->AddAdorner(new TLineTopAdorner(info.lineTopPen));
else
dynamic_cast<TLineTopAdorner*>(adorner)->SetPenID(info.lineTopPen);
else if (!info.hasLineTopAdorner)
delete adorner;
adorner = mPane->FindAdorner("TRoundRectAdorner");
if (info.hasRoundRectAdorner)
if (adorner == nil)
mPane->AddAdorner(new TRoundRectAdorner(info.roundRectPen));
else
dynamic_cast<TRoundRectAdorner*>(adorner)->SetPenID(info.roundRectPen);
else if (!info.hasRoundRectAdorner)
delete adorner;
adorner = mPane->FindAdorner("TShadowedFrameAdorner");
if (info.hasShadowAdorner)
if (adorner == nil)
mPane->AddAdorner(new TShadowedFrameAdorner(info.shadowColor));
else
dynamic_cast<TShadowedFrameAdorner*>(adorner)->SetColor(info.shadowColor);
else if (!info.hasShadowAdorner)
delete adorner;
adorner = mPane->FindAdorner("TSuppressDrawingAdorner");
if (info.hasSupressAdorner && adorner == nil)
mPane->AddAdorner(new TSuppressDrawingAdorner);
else if (!info.hasSupressAdorner)
delete adorner;
mPane->Invalidate();
}
#pragma mark -
// ===================================================================================
// CAdornerEditor
// ===================================================================================
static TReanimatorRegister<CAdornerEditor> sAdornersEditorRegistrar;
//---------------------------------------------------------------
//
// CAdornerEditor::~CAdornerEditor
//
//---------------------------------------------------------------
CAdornerEditor::~CAdornerEditor()
{
}
//---------------------------------------------------------------
//
// CAdornerEditor::CAdornerEditor
//
//---------------------------------------------------------------
CAdornerEditor::CAdornerEditor(TView* superView) : CRootPaneEditor(superView)
{
mPane = nil;
}
//---------------------------------------------------------------
//
// CAdornerEditor::Create [static]
//
//---------------------------------------------------------------
MReanimatable* CAdornerEditor::Create(MReanimatable* parent)
{
return new CAdornerEditor(dynamic_cast<TView*>(parent));
}
//---------------------------------------------------------------
//
// CAdornerEditor::SetPane
//
//---------------------------------------------------------------
void CAdornerEditor::SetPane(TPane* pane)
{
ASSERT(pane != nil);
ASSERT(mPane == nil);
mPane = dynamic_cast<TPane*>(pane);
ASSERT(mPane != nil);
mOldInfo = this->GetPaneInfo();
this->SetEditorInfo(mOldInfo);
}
//---------------------------------------------------------------
//
// CAdornerEditor::Apply
//
//---------------------------------------------------------------
void CAdornerEditor::Apply()
{
SAdornerInfo info = this->GetEditorInfo();
this->SetPaneInfo(info);
}
//---------------------------------------------------------------
//
// CAdornerEditor::Commit
//
//---------------------------------------------------------------
void CAdornerEditor::Commit(TMultipleUndoableCommand* command)
{
SAdornerInfo newInfo = this->GetEditorInfo();
command->AddCommand(new CEditAdornersCommand(mPane, mOldInfo, newInfo));
}
//---------------------------------------------------------------
//
// CAdornerEditor::Revert
//
//---------------------------------------------------------------
void CAdornerEditor::Revert()
{
this->SetEditorInfo(mOldInfo);
this->SetPaneInfo(mOldInfo);
}
//---------------------------------------------------------------
//
// CAdornerEditor::GetPaneInfo
//
//---------------------------------------------------------------
SAdornerInfo CAdornerEditor::GetPaneInfo() const
{
SAdornerInfo info;
TAdorner* adorner = nil;
adorner = mPane->FindAdorner("TDefaultButtonAdorner");
info.hasDefaultButtonAdorner = adorner != nil;
adorner = mPane->FindAdorner("TEraseAdorner");
info.hasEraseAdorner = adorner != nil;
if (adorner != nil)
info.eraseColor = dynamic_cast<TEraseAdorner*>(adorner)->GetColor();
else
info.eraseColor = kRGBWhite;
adorner = mPane->FindAdorner("TFocusRectAdorner");
info.hasFocusAdorner = adorner != nil;
adorner = mPane->FindAdorner("TFrameAdorner");
info.hasFrameAdorner = adorner != nil;
if (adorner != nil)
info.framePen = dynamic_cast<TFrameAdorner*>(adorner)->GetPenID();
else
info.framePen = 0;
adorner = mPane->FindAdorner("TLineLeftAdorner");
info.hasLineLeftAdorner = adorner != nil;
if (adorner != nil)
info.lineLeftPen = dynamic_cast<TLineLeftAdorner*>(adorner)->GetPenID();
else
info.lineLeftPen = 0;
adorner = mPane->FindAdorner("TLineRightAdorner");
info.hasLineRightAdorner = adorner != nil;
if (adorner != nil)
info.lineRightPen = dynamic_cast<TLineRightAdorner*>(adorner)->GetPenID();
else
info.lineRightPen = 0;
adorner = mPane->FindAdorner("TLineBottomAdorner");
info.hasLineBottomAdorner = adorner != nil;
if (adorner != nil)
info.lineBottomPen = dynamic_cast<TLineBottomAdorner*>(adorner)->GetPenID();
else
info.lineBottomPen = 0;
adorner = mPane->FindAdorner("TLineTopAdorner");
info.hasLineTopAdorner = adorner != nil;
if (adorner != nil)
info.lineTopPen = dynamic_cast<TLineTopAdorner*>(adorner)->GetPenID();
else
info.lineTopPen = 0;
adorner = mPane->FindAdorner("TRoundRectAdorner");
info.hasRoundRectAdorner = adorner != nil;
if (adorner != nil)
info.roundRectPen = dynamic_cast<TRoundRectAdorner*>(adorner)->GetPenID();
else
info.roundRectPen = 0;
adorner = mPane->FindAdorner("TShadowedFrameAdorner");
info.hasShadowAdorner = adorner != nil;
if (adorner != nil)
info.shadowColor = dynamic_cast<TShadowedFrameAdorner*>(adorner)->GetColor();
else
info.shadowColor = kRGBBlack;
adorner = mPane->FindAdorner("TSuppressDrawingAdorner");
info.hasSupressAdorner = adorner != nil;
return info;
}
//---------------------------------------------------------------
//
// CAdornerEditor::SetPaneInfo
//
//---------------------------------------------------------------
void CAdornerEditor::SetPaneInfo(const SAdornerInfo& info)
{
TAutoPtr<CEditAdornersCommand> command(new CEditAdornersCommand(mPane, mOldInfo, info));
command->UpdatePane(info);
}
//---------------------------------------------------------------
//
// CAdornerEditor::GetEditorInfo
//
//---------------------------------------------------------------
SAdornerInfo CAdornerEditor::GetEditorInfo() const
{
SAdornerInfo info;
TControl* control = nil;
control = dynamic_cast<TControl*>(this->FindSubPane("TDefaultButtonAdorner"));
info.hasDefaultButtonAdorner = control->GetValue() != 0;
control = dynamic_cast<TControl*>(this->FindSubPane("TEraseAdorner"));
info.hasEraseAdorner = control->GetValue() != 0;
info.eraseColor = dynamic_cast<TColorSwatch*>(this->FindSubPane("Erase Color"))->GetColor();
control = dynamic_cast<TControl*>(this->FindSubPane("TFocusRectAdorner"));
info.hasFocusAdorner = control->GetValue() != 0;
control = dynamic_cast<TControl*>(this->FindSubPane("TFrameAdorner"));
info.hasFrameAdorner = control->GetValue() != 0;
info.framePen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Frame Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TLineLeftAdorner"));
info.hasLineLeftAdorner = control->GetValue() != 0;
info.lineLeftPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Left Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TLineRightAdorner"));
info.hasLineRightAdorner = control->GetValue() != 0;
info.lineRightPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Right Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TLineBottomAdorner"));
info.hasLineBottomAdorner = control->GetValue() != 0;
info.lineBottomPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Bottom Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TLineTopAdorner"));
info.hasLineTopAdorner = control->GetValue() != 0;
info.lineTopPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Top Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TRoundRectAdorner"));
info.hasRoundRectAdorner = control->GetValue() != 0;
info.roundRectPen = dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Round Rect Pen"))->GetID();
control = dynamic_cast<TControl*>(this->FindSubPane("TShadowedFrameAdorner"));
info.hasShadowAdorner = control->GetValue() != 0;
info.shadowColor = dynamic_cast<TColorSwatch*>(this->FindSubPane("Shadow Color"))->GetColor();
control = dynamic_cast<TControl*>(this->FindSubPane("TSuppressDrawingAdorner"));
info.hasSupressAdorner = control->GetValue() != 0;
return info;
}
//---------------------------------------------------------------
//
// CAdornerEditor::SetEditorInfo
//
//---------------------------------------------------------------
void CAdornerEditor::SetEditorInfo(const SAdornerInfo& info)
{
TControl* control = nil;
control = dynamic_cast<TControl*>(this->FindSubPane("TDefaultButtonAdorner"));
control->SetValue(info.hasDefaultButtonAdorner);
control = dynamic_cast<TControl*>(this->FindSubPane("TEraseAdorner"));
control->SetValue(info.hasEraseAdorner);
dynamic_cast<TColorSwatch*>(this->FindSubPane("Erase Color"))->SetColor(info.eraseColor);
control = dynamic_cast<TControl*>(this->FindSubPane("TFocusRectAdorner"));
control->SetValue(info.hasFocusAdorner);
control = dynamic_cast<TControl*>(this->FindSubPane("TFrameAdorner"));
control->SetValue(info.hasFrameAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Frame Pen"))->SetID(info.framePen);
control = dynamic_cast<TControl*>(this->FindSubPane("TLineLeftAdorner"));
control->SetValue(info.hasLineLeftAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Left Pen"))->SetID(info.lineLeftPen);
control = dynamic_cast<TControl*>(this->FindSubPane("TLineRightAdorner"));
control->SetValue(info.hasLineRightAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Right Pen"))->SetID(info.lineRightPen);
control = dynamic_cast<TControl*>(this->FindSubPane("TLineBottomAdorner"));
control->SetValue(info.hasLineBottomAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Bottom Pen"))->SetID(info.lineBottomPen);
control = dynamic_cast<TControl*>(this->FindSubPane("TLineTopAdorner"));
control->SetValue(info.hasLineTopAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Line Top Pen"))->SetID(info.lineTopPen);
control = dynamic_cast<TControl*>(this->FindSubPane("TRoundRectAdorner"));
control->SetValue(info.hasRoundRectAdorner);
dynamic_cast<CRsrcPopupMenu*>(this->FindSubPane("Round Rect Pen"))->SetID(info.roundRectPen);
control = dynamic_cast<TControl*>(this->FindSubPane("TShadowedFrameAdorner"));
control->SetValue(info.hasShadowAdorner);
dynamic_cast<TColorSwatch*>(this->FindSubPane("Shadow Color"))->SetColor(info.shadowColor);
control = dynamic_cast<TControl*>(this->FindSubPane("TSuppressDrawingAdorner"));
control->SetValue(info.hasSupressAdorner);
}